package com.onlygx.dva.mysql.entity.common;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 瞳见科技
 *
 * @author : GaoXiang
 * 时间 : 2021/12/21
 * 介绍 : 通用分页查询父类
 */
@Data
public class PageParam {

    @ApiModelProperty("当前第几页，默认应该是：1")
    private Integer current = 1;

    @ApiModelProperty("每页显示条数，默认应该是：10")
    private Integer size = 10;

    @ApiModelProperty("正序排序字段")
    private List<String> asc;

    @ApiModelProperty("反序排序字段")
    private List<String> desc;


    /**
     * 数据库添加以下判断逻辑
     *         <if test="param.searchBeganTime != null" >
     *             and TO_DAYS(`create_time`) &gt;= TO_DAYS(#{param.searchBeganTime})
     *         </if>
     *         <if test="param.searchEndTime != null" >
     *             and TO_DAYS(`create_time`) &lt;= TO_DAYS(#{param.searchEndTime})
     *         </if>
     */
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd")
    @ApiModelProperty("时间段查询 - 开始时间（部分接口使用）")
    private Date searchBeganTime;

    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd")
    @ApiModelProperty("时间段查询 - 结束时间（部分接口使用）")
    private Date searchEndTime;


    /**
     * 创建分页数据
     * 作者：高祥
     * 时间：2021年12月22日10:52:36
     */
    public <T> Page<T> createPageInfo(){
        Page<T> page = new Page<>();
        page.setCurrent(this.current);
        page.setSize(this.size);
        page.setOrders(initOrders());
        return page;
    }

    /**
     * 初始化排序列
     * 作者：高祥
     * 时间：2021年12月22日14:00:36
     */
    private List<OrderItem> initOrders(){
        List<OrderItem> orderItems = new ArrayList<>();
        if(ObjectUtil.isNotNull(asc) && asc.size() > 0){
            asc.forEach(item -> orderItems.add(buildOrders(item,true)));
        }
        if(ObjectUtil.isNotNull(desc) && desc.size() > 0){
            desc.forEach(item -> orderItems.add(buildOrders(item,false)));
        }
        return orderItems;
    }

    /**
     * 注入攻击审查
     * 作者：高祥
     * 时间：2021年12月22日14:00:10
     */
    public OrderItem buildOrders(String column,boolean asc){
        //后期正则表达式来完善
        if(ObjectUtil.isEmpty(column) || column.contains("(") || column.contains(";")){
            return null;
        }
        return new OrderItem(StrUtil.toUnderlineCase(column),asc);
    }
}
